/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trabalhocompiladores.entidade.automato.Operacoes;

import trabalhocompiladores.entidade.Automato;
import trabalhocompiladores.entidade.Estado;
import trabalhocompiladores.entidade.Expressao;
import trabalhocompiladores.entidade.Transacao;

/**
 *
 * @author u031254
 */
public class OperacaoPadrao implements IOperacoes{

    @Override
    public void gerarEstados(Automato automato, Expressao expressao) {
       
        
        
        //verifica quanto estados tem no automato
      int contStates, contStatesInicial;
      contStates = contStatesInicial = automato.getEstados().size();    
      
      //analisa se tem algum estado
      
      
      if(contStatesInicial == 0){
          
          //cria 2 estados
         Estado q0 = new Estado(contStates);
         contStates++;
         Estado q1 = new Estado(contStates);
         //cria o laço entre os estados com a transacao
         Transacao t0 = new Transacao(expressao.getExpressao(),q0,q1);
         //adiciona a transacao ao estado
         q0.getLista().add(t0);
         
         //adiciona os estados ao automato
         automato.getEstados().put(q0.getId(), q0);
         automato.getEstados().put(q1.getId(), q1);
      }         
      else
      {         
          //cria uma transacao entre o estado atual e um outro estado a ser criado      
         Estado atual =  automato.getEstados().get(contStates - 1);
         Transacao transacao = new Transacao();
         transacao.setEstadoIn(atual);
         Estado q = new Estado(contStates);
         transacao.setEstadoFim(q);
         transacao.setValor(expressao.getExpressao());
         //adiciona a transacao ao estado atual
         atual.getLista().add(transacao);
         automato.getEstados().put(atual.getId(),atual );
         automato.getEstados().put(q.getId(),q );  

      }
    }
    
}
